package mutacion;

import java.util.ArrayList;

import utils.Arbol;
import utils.SRandom;
import cromosoma.CromosomaBloques;


public class MutacionFuncionalSimple implements Mutacion{

	public void mutacion(CromosomaBloques c, double probMutacion) {
		
		ArrayList<Arbol> preOrden=null;
		String[] cjtoFunc1Operandos = {"MP","MM","NOT"};
		String[] cjtoFunc2Operandos = {"DU","EQ"};
		double numAle = SRandom.nextDouble();
		
		if (numAle < probMutacion)
		{
			boolean usarOp1 = SRandom.nextBoolean();
			if (usarOp1)
			{
				preOrden = c.get_gen().preordenOp1SR();
			}
			else preOrden = c.get_gen().preordenOp2SR();
			
			if (preOrden.size() > 0) {
				int numAle2= SRandom.nextInt((preOrden.size()));
				Arbol nodo= preOrden.get(numAle2);
				
				if (usarOp1)
				{
					int numAle3= SRandom.nextInt(cjtoFunc1Operandos.length);
					nodo.setNombre(cjtoFunc1Operandos[numAle3]);
				}
				else 
				{
					int numAle3= SRandom.nextInt(cjtoFunc2Operandos.length);
					nodo.setNombre(cjtoFunc2Operandos[numAle3]);
				}
			}
			
		}
	}
	/*
	private Arbol getFuncionAleatorio(CromosomaBloques c) {
		
		if (c.get_gen().getNumNodos() == 1) return null;
		
		int numAleNodos = SRandom.nextInt(c.get_gen().getNumNodos());
		Arbol a = c.get_gen().GetArbolPosicion(c.get_gen(), numAleNodos);
		//mientras la raiz del nodo sea una terminal seguir buscando.
		while (a==null || esTerminal(a))
		{
			numAleNodos = SRandom.nextInt(c.get_gen().getNumNodos());
			a = c.get_gen().GetArbolPosicion(c.get_gen(), numAleNodos);
		}
		return a;
		
	}

	private boolean esFuncion1Operando(Arbol nodo) {
		if ((nodo.getNombre().equals("DU"))  
			|| (nodo.getNombre().equals("EQ")))
			return true;
			else
			return false;
	}

	private boolean esFuncion2Operandos(Arbol nodo) {
		if ((nodo.getNombre().equals("MP")) 
				|| (nodo.getNombre().equals("MM")) 
				|| (nodo.getNombre().equals("NOT")))
			return true;
			else
			return false;
	}

	

	private boolean esTerminal(Arbol a) {
		if ((a.getNombre().equals("CP")) 
				|| (a.getNombre().equals("BS")) 
				|| (a.getNombre().equals("SN")))
			return true;
			else
			return false;
	}

	*/
	
}